home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / gfx / show / svoUtah22.lha / svoUtahRLE / source / SV_BufferSubs.c < prev    next >
C/C++ Source or Header  |  1995-04-14  |  5KB  |  168 lines

  1.  
  2.  /* SV_BufferSubs.c
  3.     - Functions for Buffering UtahRLE Files -
  4.     (c) 1993-95 by Andreas R. Kleinert
  5.     Last changes : 14.04.1995
  6.  */
  7.  
  8.  
  9. #include "svobject.h"
  10.  
  11. ULONG __saveds __asm SVO_ReadToGfxBuffer( register __a1 struct SVObjectHandle *SVObjectHandle_a1);
  12. ULONG __saveds __asm SVO_GetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
  13.                                           register __a2 struct SV_GfxBuffer **bufferhandle,
  14.                                           register __a3 ULONG future);
  15. ULONG __saveds __asm SVO_SetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
  16.                                           register __a2 struct SV_GfxBuffer *bufferhandle,
  17.                                           register __a3 ULONG future);
  18.  
  19.  
  20. ULONG __saveds __stdargs SVLI_UnPackRLE(struct rle_hdr *RLEHeader, UBYTE *dptr, ULONG width, ULONG height);
  21.  
  22.  
  23. /* *************************************************** */
  24. /* *                             * */
  25. /* * ...                                             * */
  26. /* *                             * */
  27. /* *************************************************** */
  28.  
  29. ULONG __saveds __asm SVO_ReadToGfxBuffer( register __a1 struct SVObjectHandle *SVObjectHandle_a1)
  30. {
  31.  struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
  32.  
  33.  ULONG retval = SVERR_NO_ERROR, rleret = N;
  34.  ULONG pic_width, pic_height, pic_depth;
  35.  
  36.  struct rle_hdr __aligned RLEHeader;
  37.  
  38.  
  39.  if(!SVObjectHandle) return(SVERR_NO_HANDLE);
  40.  
  41.  
  42.  if(!(SVObjectHandle->ah_filehandle_dest = Open(SVObjectHandle->ah_ReadName, MODE_OLDFILE))) return(SVERR_FILE_NOT_FOUND);
  43.  if(!(SVObjectHandle->ah_FILE_dest       = fopen(SVObjectHandle->ah_ReadName, "r")))         return(SVERR_FILE_NOT_FOUND);
  44.  
  45.  
  46.  RLEHeader.rle_file = SVObjectHandle->ah_FILE_dest;
  47.  
  48.  rleret = rle_get_setup(&RLEHeader);
  49.  if(rleret != RLE_SUCCESS)
  50.   {
  51.    switch(rleret)
  52.     {
  53.      case RLE_NO_SPACE: return(SVERR_NO_MEMORY);          break;
  54.      default:           return(SVERR_UNKNOWN_PARAMETERS); break;
  55.     }
  56.   }
  57.  
  58.  SVObjectHandle->ah_Type = SVObjectBase->svb_SVObject->svo_SubTypeCode[0];
  59.  
  60.  
  61.  pic_width  = RLEHeader.xmax - RLEHeader.xmin + 1;
  62.  pic_height = RLEHeader.ymax - RLEHeader.ymin + 1;
  63.  pic_depth  = RLEHeader.ncolors << 3;
  64.  
  65.  RLEHeader.xmin = 0;          /* align pic_width */
  66.  RLEHeader.xmax = pic_width - 1;
  67.  
  68.  
  69.  if(RLEHeader.ncmap && (RLEHeader.ncmap!=3) ) return(SVERR_UNKNOWN_PARAMETERS);
  70.  if(pic_depth != 24)                              return(SVERR_UNKNOWN_PARAMETERS);
  71.  
  72.  RLE_CLR_BIT(RLEHeader, RLE_ALPHA); /* don't want Alpha Channel */
  73.  
  74.  
  75.  SVObjectHandle->ah_SV_GfxBuffer = AllocVec(sizeof(struct SV_GfxBuffer), (MEMF_CLEAR|MEMF_PUBLIC));
  76.  if(!SVObjectHandle->ah_SV_GfxBuffer) return(SVERR_NO_MEMORY);
  77.  
  78.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_Version = SVGFX_VERSION;
  79.  
  80.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_BufferType   = SVGFX_BUFFERTYPE_ONEPLANE;
  81.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_Width        = pic_width;
  82.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_Height       = pic_height;
  83.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_ColorDepth   = 24;
  84.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_PixelBits    = 24;
  85.  
  86.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_BufferSize   = pic_width * pic_height * 3;
  87.  
  88.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_Buffer = AllocVec(SVObjectHandle->ah_SV_GfxBuffer->svgfx_BufferSize, (MEMF_CLEAR|MEMF_PUBLIC));
  89.  if(!SVObjectHandle->ah_SV_GfxBuffer->svgfx_Buffer) return(SVERR_NO_MEMORY);
  90.  
  91.  SVObjectHandle->ah_SV_GfxBuffer->svgfx_ViewMode32 = SVSUP_GetBestModeID(pic_width, pic_height, 8);
  92.  
  93.  retval = SVLI_UnPackRLE(&RLEHeader, SVObjectHandle->ah_SV_GfxBuffer->svgfx_Buffer, pic_width, pic_height);
  94.  
  95.  return(retval);
  96. }
  97.  
  98. ULONG __saveds __asm SVO_GetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
  99.                                           register __a2 struct SV_GfxBuffer **bufferhandle,
  100.                                           register __a3 ULONG future)
  101. {
  102.  struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
  103.  ULONG retval = SVERR_NO_ERROR;
  104.  
  105.  if(!SVObjectHandle) return(SVERR_NO_HANDLE);
  106.  
  107.  if(!bufferhandle) return(SVERR_ILLEGAL_ACCESS);
  108.  
  109.  *bufferhandle = SVObjectHandle->ah_SV_GfxBuffer;
  110.  
  111.  return(retval);
  112. }
  113.  
  114. ULONG __saveds __asm SVO_SetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
  115.                                           register __a2 struct SV_GfxBuffer *bufferhandle,
  116.                                           register __a3 ULONG future)
  117. {
  118.  struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
  119.  ULONG retval = SVERR_NO_ERROR;
  120.  
  121.  if(!SVObjectHandle) return(SVERR_NO_HANDLE);
  122.  
  123.  if(!bufferhandle) return(SVERR_ILLEGAL_ACCESS);
  124.  
  125.  SVObjectHandle->ah_SV_GfxBuffer2 = bufferhandle;
  126.  
  127.  return(retval);
  128. }
  129.  
  130. ULONG __saveds __stdargs SVLI_UnPackRLE(struct rle_hdr *RLEHeader, UBYTE *dptr, ULONG width, ULONG height)
  131. {
  132.  ULONG j, w3, w3_2;
  133.  UBYTE *start, *r_row, *g_row, *b_row, *row_vec[3];
  134.  
  135.  w3   = width * 3;
  136.  w3_2 = w3 << 1;
  137.  
  138.  start = AllocVec(w3, MEMF_CLEAR|MEMF_PUBLIC);
  139.  if(!start) return(SVERR_NO_MEMORY);
  140.  
  141.  row_vec[2] = (row_vec[1] = (row_vec[0] = start) + width) + width;
  142.  
  143.  dptr += (w3 * height);
  144.  dptr -= w3;
  145.  
  146.  while(height--)
  147.   {
  148.    r_row = row_vec[0];
  149.    g_row = row_vec[1];
  150.    b_row = row_vec[2];
  151.  
  152.    rle_getrow(RLEHeader, &row_vec[0]);
  153.  
  154.    for(j=0; j<width; j++)
  155.     {
  156.      *dptr++ = *r_row++;
  157.      *dptr++ = *g_row++;
  158.      *dptr++ = *b_row++;
  159.     }
  160.  
  161.    dptr -= w3_2;
  162.   }
  163.  
  164.  FreeVec(start);
  165.  
  166.  return(SVERR_NO_ERROR);
  167. }
  168.